/**
 * 
 */
package com.yidu.drug.action;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yidu.drug.common.Page;
import com.yidu.drug.common.Tools;
import com.yidu.drug.model.FdSellDetailModel;
import com.yidu.drug.model.FinancialRecordModel;
import com.yidu.drug.model.FinancialSheetsModel;
import com.yidu.drug.model.InventoryModel;
import com.yidu.drug.model.InventoryRecordModel;
import com.yidu.drug.model.RepertoryModel;
import com.yidu.drug.model.ReturnsDetailModel;
import com.yidu.drug.model.SalesReturnModel;
import com.yidu.drug.model.WholesaleDetailModel;
import com.yidu.drug.model.WholesaleModel;
import com.yidu.drug.service.FdSellDetailService;
import com.yidu.drug.service.FinancialRecordService;
import com.yidu.drug.service.FinancialSheetsService;
import com.yidu.drug.service.InventoryRecordService;
import com.yidu.drug.service.InventoryService;
import com.yidu.drug.service.RepertoryService;
import com.yidu.drug.service.ReturnsDetailService;
import com.yidu.drug.service.SalesReturnService;
import com.yidu.drug.service.WholesaleDetaiService;
import com.yidu.drug.service.WholesaleService;

/**
 * 类的描述--退货单明细表action
 * @author yuanqing
 * @date 2018年8月9日下午3:22:40
 * @version 1.0
 */
@Controller
@RequestMapping("/detail")
public class ReturnsDetailAction {
	/**
	 * 分店销售详情Service
	 */
	@Resource
	private FdSellDetailService fdSellDetailService;
	/**
	 * 批发详情Service
	 */
	@Resource
	private WholesaleDetaiService wholesaleDetaiService;
	/**
	 * 退货Service
	 */
	@Resource
	private SalesReturnService salesReturnService;
	/**
	 * 退货详情Service
	 */
	@Resource
	private ReturnsDetailService returnsDetailService;
	/**
	 * 财务Service
	 */
	@Resource
	private FinancialSheetsService financialSheetsService;
	/**
	 * 财务记录Service
	 */
	@Resource
	private FinancialRecordService financialRecordService;
	/**
	 * 库存Service
	 */
	@Resource
	private RepertoryService repertoryService;
	/**
	 * 库存记录Service
	 */
	@Resource
	private InventoryRecordService inventoryRecordService;
	
	/**
	 * 库存明细Service
	 */
	@Resource
	private InventoryService inventoryService;
	/**
	 * 查询所有和条件查询分页
	 * @param response 响应
	 * @param me 会员对象
	 * @param page 页数
	 * @param limit 行数
	 * @return
	 */
	@RequestMapping("detailFindAll")
	@ResponseBody
	public Map<String, Object> findAll(HttpServletResponse response,ReturnsDetailModel me,int page,int limit) {
		
		response.setCharacterEncoding("UTF-8");
		Page pages = new Page();
		pages.setPage(page);
		pages.setRows(limit);
		Map<String,String> map=new HashMap<>();
		map.put("drugId", me.getDrugId());
		map.put("oper", me.getOper());
		map.put("start", String.valueOf(pages.getStart()));
		map.put("rows", String.valueOf(pages.getRows()));
		List<ReturnsDetailModel> list = returnsDetailService.findAllPage(map);
		Map<String, Object> maps = new HashMap<>();
		//需要符合layUI格式，code msg count data
		maps.put("code", 0);
		maps.put("msg", "1");
		maps.put("count", returnsDetailService.findTotalRows(me));
		maps.put("data", list);
		me=new ReturnsDetailModel();
		
		return maps;
	}
	/**
	 * 修改
	 * @param id 
	 * @return 页面跳转
	 */
	@RequestMapping("deleteDetail")
	@ResponseBody
	public String deleteMember(String id){
		String str=null;
		if(!Tools.isEmpty(id)){
			int row= returnsDetailService.deleteByPrimaryKey(id);
			if(row>0){
				str="ok";
			}
		}
		return str;

	}
	/**
	 * 增加和修改
	 * @param session web存储空间
	 * @param me 会员对象
	 * @return 页面跳转
	 */
	@RequestMapping("/addOrUpdate")
	public String addOrUpdate(HttpSession session, ReturnsDetailModel me) {
		System.out.println("11111111111");
		
		Timestamp reDate = new Timestamp(new Date().getTime());
		if(!Tools.isEmpty(me.getRdId())) {
			
			me.setRdId(UUID.randomUUID().toString());
			me.setOptime(reDate);
			returnsDetailService.insert(me);
		}else {
			returnsDetailService.updateByPrimaryKeySelective(me);
		}
		
		
		return "redirect:/pages/yq/returnsDetail.html";
	}
	/** 
	 * 财务减少 库存增加的方法(零售退货)    梅李娜
	 * @param returnDetail 退货详情对象
	 * @param totalMoney  总金额
	 * @param reCause    退货原因
	 * @param jsonStr   json参数
	 * @return 自定义参数
	 */
	@RequestMapping("/save")
	@ResponseBody
	public String save(ReturnsDetailModel returnDetail,BigDecimal totalMoney,String reCause,String jsonStr) {	
		//新建退货模型对象
		SalesReturnModel salesReturn = new SalesReturnModel();
		//设置退货ID随机为UUID
		String reId = UUID.randomUUID().toString().replaceAll("-", "");
		//给退货ID,退货原因,退货金额,分公司ID,是否有效设值
		salesReturn.setReId(reId);
		salesReturn.setReCause(reCause);
		salesReturn.setReMoney(totalMoney);
		salesReturn.setFilId("1");
		salesReturn.setIsva("否");
		//调用退货Service的增加方法
		salesReturnService.save(salesReturn);
		System.out.println(jsonStr+"============");
		//新建一个Gson对象
		Gson gson = new Gson();
		//TypeToken内的泛型就是Json数据中的类型
		java.lang.reflect.Type listType=new TypeToken<ArrayList<ReturnsDetailModel>>(){}.getType();
		ArrayList<ReturnsDetailModel> list = gson.fromJson(jsonStr, listType);
		//初始化参数
		int rows = 0;
		//使用foreach生成退货详情表
		for(ReturnsDetailModel re:list){
			//设置退货详情ID随机为UUID
			String rdId = UUID.randomUUID().toString().replaceAll("-", "");
			//退货详情小计 = 退货详情的物品数量 * 退货详情传过来的 折扣后单价    并强转double型
			double xiaoJi = Double.valueOf(re.getRdNumber()) * Double.valueOf(re.getMxPrices());
			//给退货详细ID,退货ID,合计,小计强转(BigDecimal)设值
			re.setRdId(rdId);
			re.setReId(reId);
			re.setRdTotal(totalMoney);
			re.setRdSubtotal(BigDecimal.valueOf(xiaoJi));
			//参数 =调用退货详情Service的增加方法
			rows = returnsDetailService.save(re);
			
		}
		

		int row = salesReturnService.updateIsva(salesReturn.getReId());
		//退货表  调用退货Service的根据ID查找的方法 退货ID
		SalesReturnModel salesReturns = salesReturnService.findById(reId);
		//财务表  调用财务Service的根据分店ID查找的方法 (得到退货表的分店ID赋值给它)
		FinancialSheetsModel financialsheets = financialSheetsService.selectByFilId(salesReturn.getFilId());
		//定义个 BigDecimal参数     用财务表的 财务金额  subtract 退货表的退货金额
		BigDecimal num = financialsheets.getFsPrice().subtract(salesReturns.getReMoney());
		//把上面相减的金额  重新  设值给财务表的财务金额 
		financialsheets.setFsPrice(num);
		//调用财务Service 修改方法(财务表);
		financialSheetsService.update(financialsheets);
		//新建一个财务记录对象
		FinancialRecordModel financialRecord = new FinancialRecordModel();
		//设置财务记录ID随机为UUID
		String frId = UUID.randomUUID().toString().replaceAll("-", "");
		//给财务记录ID,财务ID(财务表得到财务ID),业务ID(退货ID),财务记录总金额(财务表得到财务金额)
		//财务记录进出帐(退货表得到退货金额),财务记录备注(退货表得到退货原因),财务记录名称(支出)
		//是否有效(),财务记录时间
		financialRecord.setFrId(frId);
		financialRecord.setFsId(financialsheets.getFsId());
		financialRecord.setPwId(reId);
		financialRecord.setFrSumprice(financialsheets.getFsPrice());
		financialRecord.setFrPrice(salesReturn.getReMoney());
		financialRecord.setFrName("支出");	
		financialRecord.setFrRemark(salesReturn.getReCause());
		financialRecord.setIsva("否");
		//取到当前时间给财务记录时间
		Timestamp frDate = new Timestamp(new Date().getTime());
		financialRecord.setFrTime(frDate);
		//调用财务记录Service的增加方法(财务记录)
		financialRecordService.insertSelective(financialRecord);
		
		
		
		
		//退货详情集合  调用退货详情Service的根据退货ID查找(退货ID)
		List<ReturnsDetailModel> returnDetails = returnsDetailService.selectByReId(reId);
		
		//库存表  调用库存Service的根据分店ID查找(退货表得到分店ID)
		RepertoryModel repertory = repertoryService.selectByFilId(salesReturn.getFilId());
		//用foreach循环 退货详情
		for (ReturnsDetailModel returnsDetailModel : returnDetails) {
			
			//定义Long参数    库存表数量+ 退货详情的物品数量
			
			Long nums = repertory.getRepNumber()+(returnsDetailModel.getRdNumber());
			//给库存数量(上面的值赋给它),操作时间 设值
			repertory.setRepNumber(nums);
			//取到当前时间赋值给操作时间
			Timestamp opTime = new Timestamp(new Date().getTime());
			repertory.setOptime(opTime);
			//调用库存Service的修改方法(库存)
			repertoryService.update(repertory);
			
			java.lang.reflect.Type listTypes=new TypeToken<ArrayList<FdSellDetailModel>>(){}.getType();//TypeToken内的泛型就是Json数据中的类型
			ArrayList<FdSellDetailModel> lists = gson.fromJson(jsonStr, listTypes);
			int rowss = 0;
			//用foreach循环 分店销售详情
			for (FdSellDetailModel fdSellDetailModel : lists) {
				//分店销售详情  调用分店销售详情Service的根据分店销售详情ID的方法(分店销售详情得到分店销售详情ID)
				FdSellDetailModel fdSellDetail = fdSellDetailService.findByMxId(fdSellDetailModel.getMxId());
				
				
				
				//库存明细  调用库存明细 Service的根据分店销售详情批号的方法(强转String 分店销售详情表 得到  分店销售详情的批号)
				InventoryModel inventory = inventoryService.findByMxNumber(String.valueOf(fdSellDetail.getMxNumber()));
				//如果批号不为空
				if(inventory!=null){
					System.out.println("-----------------");
					//foreach循环 退货详情
					for (ReturnsDetailModel returnsDetailModels : returnDetails) {
						Timestamp czTime = new Timestamp(new Date().getTime());
						//库存明细 设值数量(库存明细表得到数量+ 退货详情得到退货数量)
						inventory.setInvNumber(inventory.getInvNumber()+returnsDetailModels.getRdNumber().intValue());
						inventory.setCztime(czTime);
						//调用库存明细Service的修改Service方法(库存明细)
						inventoryService.updateByPrimaryKeySelective(inventory);
						//新建一个库存记录表对象
						InventoryRecordModel inventoryRecord = new InventoryRecordModel();
						String irId = UUID.randomUUID().toString();
						inventoryRecord.setIrId(irId);
						inventoryRecord.setPwId(returnsDetailModels.getDrugId());
						inventoryRecord.setMatNum(returnsDetailModels.getRdNumber().intValue());
						inventoryRecord.setIrType("入库");
						inventoryRecord.setIrTime(opTime);
						inventoryRecord.setNumbers(String.valueOf(fdSellDetail.getMxNumber()));
						//调用库存记录Service的增加方法
						inventoryRecordService.insertSelective(inventoryRecord);
						
						
						//减少分店销售详情表中的数量
						Long all = fdSellDetail.getMxQuantity()-returnsDetailModels.getRdNumber();
						fdSellDetailModel.setMxQuantity(all);
						fdSellDetailService.updateByPrimaryKeySelective(fdSellDetailModel);
						/*if(all<=0){
							//fdSellDetail.set
							fdSellDetailService.updateByPrimaryKeySelective(fdSellDetailModel);
							fdSellDetailService.deleteByPrimaryKey(fdSellDetail.getMxId());
							
						}else{*/
						
						
					}
				}	
			}
			
			
			
		
		}
		if(rows>0){
			return "ok";
		}else{
			return "no";
		}
		
	}
		
	
	
	/** 
	 * 财务减少 库存增加的方法(批发退货)    梅李娜
	 * @param returnDetail 退货详情对象
	 * @param totalMoney  总金额
	 * @param reCause    退货原因
	 * @param jsonStr   json参数
	 * @return 自定义参数
	 */
	@RequestMapping("/saves")
	@ResponseBody
	public String saves(ReturnsDetailModel returnDetail,BigDecimal totalMoney,String reCause,String jsonStr) {	
		//新建退货模型对象
		SalesReturnModel salesReturn = new SalesReturnModel();
		//设置退货ID随机为UUID
		String reId = UUID.randomUUID().toString().replaceAll("-", "");
		//给退货ID,退货原因,退货金额,分公司ID,是否有效设值
		salesReturn.setReId(reId);
		salesReturn.setReCause(reCause);
		salesReturn.setReMoney(totalMoney);
		salesReturn.setFilId("1");
		salesReturn.setIsva("否");
		//调用退货Service的增加方法
		salesReturnService.save(salesReturn);
		System.err.println(jsonStr+"============");
		//新建一个Gson对象
		Gson gson = new Gson();
		//TypeToken内的泛型就是Json数据中的类型
		java.lang.reflect.Type listType=new TypeToken<ArrayList<ReturnsDetailModel>>(){}.getType();
		ArrayList<ReturnsDetailModel> list = gson.fromJson(jsonStr, listType);
		//初始化参数
		int rows = 0;
		//使用foreach生成退货详情表
		for(ReturnsDetailModel re:list){
			//设置退货详情ID随机为UUID
			String rdId = UUID.randomUUID().toString().replaceAll("-", "");
			/*//退货详情小计 = 退货详情的物品数量 * 退货详情传过来的 折扣后单价    并强转double型
			double xiaoJi = Double.valueOf(re.getRdNumber()) * Double.valueOf(re.getMxPrices());*/
			
			//给退货详细ID,退货ID,合计,小计强转(BigDecimal)设值
			re.setRdId(rdId);
			re.setReId(reId);
			re.setRdTotal(totalMoney);
			re.setRdNumber(re.getRdNumber());
			//参数 =调用退货详情Service的增加方法
			rows = returnsDetailService.save(re);
			
		}
		

		int row = salesReturnService.updateIsva(salesReturn.getReId());
		//退货表  调用退货Service的根据ID查找的方法 退货ID
		SalesReturnModel salesReturns = salesReturnService.findById(reId);
		//财务表  调用财务Service的根据分店ID查找的方法 (得到退货表的分店ID赋值给它)
		FinancialSheetsModel financialsheets = financialSheetsService.selectByFilId(salesReturn.getFilId());
		//定义个 BigDecimal参数     用财务表的 财务金额  subtract 退货表的退货金额
		BigDecimal num = financialsheets.getFsPrice().subtract(salesReturns.getReMoney());
		//把上面相减的金额  重新  设值给财务表的财务金额 
		financialsheets.setFsPrice(num);
		//调用财务Service 修改方法(财务表);
		financialSheetsService.update(financialsheets);
		//新建一个财务记录对象
		FinancialRecordModel financialRecord = new FinancialRecordModel();
		//设置财务记录ID随机为UUID
		String frId = UUID.randomUUID().toString().replaceAll("-", "");
		//给财务记录ID,财务ID(财务表得到财务ID),业务ID(退货ID),财务记录总金额(财务表得到财务金额)
		//财务记录进出帐(退货表得到退货金额),财务记录备注(退货表得到退货原因),财务记录名称(支出)
		//是否有效(),财务记录时间
		financialRecord.setFrId(frId);
		financialRecord.setFsId(financialsheets.getFsId());
		financialRecord.setPwId(reId);
		financialRecord.setFrSumprice(financialsheets.getFsPrice());
		financialRecord.setFrPrice(salesReturn.getReMoney());
		financialRecord.setFrName("支出");	
		financialRecord.setFrRemark(salesReturn.getReCause());
		financialRecord.setIsva("否");
		//取到当前时间给财务记录时间
		Timestamp frDate = new Timestamp(new Date().getTime());
		financialRecord.setFrTime(frDate);
		//调用财务记录Service的增加方法(财务记录)
		financialRecordService.insertSelective(financialRecord);
		
		
		
		
		//退货详情集合  调用退货详情Service的根据退货ID查找(退货ID)
		List<ReturnsDetailModel> returnDetails = returnsDetailService.selectByReId(reId);
		
		//库存表  调用库存Service的根据分店ID查找(退货表得到分店ID)
		RepertoryModel repertory = repertoryService.selectByFilId(salesReturn.getFilId());
		//用foreach循环 退货详情
		int ooo = 0 ;
		
		for (ReturnsDetailModel returnsDetailModel : returnDetails) {
			//定义Long参数    库存表数量+ 退货详情的物品数量
			Long nums = repertory.getRepNumber()+(returnsDetailModel.getRdNumber());
			System.out.println(repertory.getRepNumber()+"=========="+returnsDetailModel.getRdNumber());
			//给库存数量(上面的值赋给它),操作时间 设值
			repertory.setRepNumber(nums);
			//取到当前时间赋值给操作时间
			Timestamp opTime = new Timestamp(new Date().getTime());
			repertory.setOptime(opTime);
			//调用库存Service的修改方法(库存)
			repertoryService.update(repertory);
			
			java.lang.reflect.Type listTypes=new TypeToken<ArrayList<WholesaleDetailModel>>(){}.getType();//TypeToken内的泛型就是Json数据中的类型
			ArrayList<WholesaleDetailModel> lists = gson.fromJson(jsonStr, listTypes);
			int rowss = 0;
			//用foreach循环 分店销售详情
			for (WholesaleDetailModel wholesaleDetailModel : lists) {
				//分店销售详情  调用分店销售详情Service的根据分店销售详情ID的方法(分店销售详情得到分店销售详情ID)
				WholesaleDetailModel WholesaleDetail = wholesaleDetaiService.findByPfxqlId(wholesaleDetailModel.getPfxqlId());
				
				ooo+=1;
				
				//库存明细  调用库存明细 Service的根据分店销售详情批号的方法(强转String 分店销售详情表 得到  分店销售详情的批号)
				InventoryModel inventory = inventoryService.findByMxNumber(String.valueOf(WholesaleDetail.getNumbers()));
				//如果批号不为空
				if(inventory!=null){
					//foreach循环 退货详情
					for (ReturnsDetailModel returnsDetailModels : returnDetails) {
						Timestamp czTime = new Timestamp(new Date().getTime());
						//库存明细 设值数量(库存明细表得到数量+ 退货详情得到退货数量)
						inventory.setInvNumber(inventory.getInvNumber()+returnsDetailModels.getRdNumber().intValue());
						inventory.setCztime(czTime);
						//调用库存明细Service的修改Service方法(库存明细)
						inventoryService.updateByPrimaryKeySelective(inventory);
						//新建一个库存记录表对象
						InventoryRecordModel inventoryRecord = new InventoryRecordModel();
						String irId = UUID.randomUUID().toString();
						inventoryRecord.setIrId(irId);
						inventoryRecord.setPwId(returnsDetailModels.getDrugId());
						inventoryRecord.setMatNum(returnsDetailModels.getRdNumber().intValue());
						inventoryRecord.setIrType("入库");
						inventoryRecord.setIrTime(opTime);
						inventoryRecord.setOperator("小红");
						inventoryRecord.setIsva("是");
						inventoryRecord.setFilId("1");
						inventoryRecord.setNumbers(String.valueOf(WholesaleDetail.getNumbers()));
						//调用库存记录Service的增加方法
						inventoryRecordService.insertSelective(inventoryRecord);
						
					}
				}
				//减少分店销售详情表中的数量
				if((ooo/returnDetails.size())%lists.size()==1){
					int all = WholesaleDetail.getPfxqNumber	()-returnsDetailModel.getRdNumber().intValue();
					wholesaleDetailModel.setPfxqNumber(all);
					wholesaleDetaiService.updateByPrimaryKeySelective(wholesaleDetailModel);
				}
			}
			
		}
		if(rows>0){
			return "ok";
		}else{
			return "no";
		}
		
	}
	
}
